package elementaryAlgorithm;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * @author 郭辉
 * @className TODO
 * @description 52. N 皇后 II
 * n 皇后问题 研究的是如何将 n 个皇后放置在 n × n 的棋盘上，并且使皇后彼此之间不能相互攻击。
 *
 * 给你一个整数 n ，返回 n 皇后问题 不同的解决方案的数量。
 *
 *
 *
 * 示例 1：
 *
 *
 * 输入：n = 4
 * 输出：2
 * 解释：如上图所示，4 皇后问题存在两个不同的解法。
 * 示例 2：
 *
 * 输入：n = 1
 * 输出：1
 *
 *
 * 提示：
 *
 * 1 <= n <= 9
 * 通过次数115,877提交次数140,578
 * @date 2023/3/31 15:48
 * @company 海康威视
 * @since 1.0.0
 */
public class Leet52 {
    public int totalNQueens(int n) {
        List<List<Character>> qipan = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            List<Character> list = new ArrayList<>();
            for (int j = 0; j < n; j++) {
                list.add('.');
            }
            qipan.add(list);
        }
        ArrayList<Integer> list = new ArrayList<>();
        list.add(0);
        NQueeens(qipan,0,list);
        return list.get(0);
    }

    //返回条件
    //路径
    //选择
    public void NQueeens(List<List<Character>> nums,int row, ArrayList<Integer> res){
        //返回条件
        if (row>= nums.size()){
            Integer tem = res.get(0)+1;
            res.set(0,tem );
            return;
        }
        for (int i = 0; i < nums.size(); i++) {
            //剪枝
            if (!isVaild(nums,row,i)){
                continue;
            }
            //选择
            nums.get(row).set(i,'Q');
            NQueeens(nums,row+1,res);
            //撤销
            nums.get(row).set(i,'.');
        }
    }

    private boolean isVaild(List<List<Character>> nums, int row, int col) {
        //同行
        for (int i = 0; i <nums.size(); i++) {
            if (nums.get(row).get(i) == 'Q'){
                return false;
            }
        }
        //同列
        for (int i = 0; i <nums.size(); i++) {
            if (nums.get(i).get(col) == 'Q'){
                return false;
            }
        }
        //同斜线
        int offset = col - row;
        for (int i = 0; i < nums.size(); i++) {
            if (i+offset >=0 && i + offset < nums.size() && nums.get(i).get(i+offset) == 'Q'){
                return false;
            }
        }
        offset = col + row;
        for (int i = 0; i < nums.size(); i++) {
            if (offset - i >=0 &&  offset - i < nums.size() && nums.get(i).get(offset - i ) == 'Q'){
                return false;
            }
        }
        return true;
    }

    public static void main(String[] args) {
        Leet52 leet52 = new Leet52();
        System.out.println(leet52.totalNQueens(8));
    }
}
